Introduccion

Estuadiantes: Adriana Corrales Quesada & Brandon Céspedes Morales

Justificacion

Actualmente los mercados financieros ofrecen diversas alternativas de inversión, que incluyen una gran variedad de activos, los cuales se diferencian entre sí, por el nivel de rentabilidad, liquidez, volatilidad y bursatilidad, asociada con los mismos; lo que conlleva a que los inversionistas utilicen diversas herramientas que les permitan escoger inversiones óptimas incurriendo en un nivel de riesgo determinado.

En este sentido, la diversificación de los portafolios de inversión es de suma importancia, ya que permite establecer qué activos son los más apropiados para conformar el portafolio de inversión, en la medida en que se logré minimizar las pérdidas de este, de acuerdo con los movimientos propios del mercado.

A partir de lo expuesto anteriormente y buscando crear una herramienta que permita realizar un análisis comparativo de portafolios de inversión de los diferentes participantes del sistema financiero, se realiza este trabajo con base en la teoría moderna de portafolios de Harry Markowitz (1952) y utilizando para ello un análisis de clúster.

Objetivo General

Desarrollar una herramienta que permita identificar de los portafolios más equilibrados en términos de rendimiento-riesgo, del sistema financiero.

Datos a utilizar

Se utilizará una tabla con las cotizaciones históricas de las diferentes opciones de inversión que forman parte de los portafolios de las entidades financieras y otra tabla de datos con los portafolios de inversión que serán parte del análisis. Por un tema de confidencialidad, no se reflejará el nombre de las entidades en el proyecto, se utilizará un código.

Por otra parte, debido a que los portafolios de inversión en Costa Rica están altamente correlacionados por la activa participación del Ministerio de Hacienda en el mercado local, se utilizarán portafolios ficticios, con el fin de realizar el análisis y determinar los portafolios de inversión más eficientes.

La tabla con las cotizaciones históricas posee como variable cada título u opción de inversión. Las filas son las fechas en las que se registró el respectivo precio. La tabla de portafolios incluye las siguientes variables: Tipo de moneda, Tipo de instrumento, Emisor, Rendimiento, Calificación crediticia del emisor, Monto de la inversión, Entidad, entre otras. Las filas serán cada una de las inversiones.

Se hará uso de las siguientes paquetes.

library(RSDA)
library(readxl)
library(dplyr)
library(ggplot2)
library(FactoMineR)
library(factoextra)
library(corrplot)
library(Hmisc)
library(cluster)

Análisis estadístico:

Se carga la base de datos:

datos <- read_excel("C:/Users/Brandon/Desktop/Proyecto de Graduacion Promidat/Datos_simulacion (1).xlsx")
str(datos)
tibble [644 x 55] (S3: tbl_df/tbl/data.frame)
 $ Dates       : POSIXct[1:644], format: "2018-11-16" "2018-11-19" ...
 $ G101121     : num [1:644] 91.4 91.4 91.4 91.1 91.2 ...
 $ G170822     : num [1:644] 89.7 89.7 89.7 89.3 89.5 ...
 $ G230823     : num [1:644] 88.3 88.3 88.2 89 89 ...
 $ G101221     : num [1:644] 101 101 101 101 101 ...
 $ G260826     : num [1:644] 108 108 108 108 108 ...
 $ G230222     : num [1:644] 102 102 102 102 102 ...
 $ G210224     : num [1:644] 100 100 100 100 100 ...
 $ G160725     : num [1:644] 96.4 96.4 96.4 96.4 96.4 ...
 $ G200524     : num [1:644] 89.8 89.8 89.7 89.5 89.6 ...
 $ G221130     : num [1:644] 88.1 88.1 88.1 87.9 87.9 ...
 $ G261125     : num [1:644] 84 84 84 84 84 ...
 $ G250522     : num [1:644] 90.2 90.2 90.1 89.8 90 ...
 $ G260527     : num [1:644] 89.8 89.8 89.8 89.8 89.8 ...
 $ B1          : num [1:644] 96.2 96.2 95.2 95.2 95 ...
 $ SERIEB3     : num [1:644] 95.8 95.8 95.8 95.8 95.8 ...
 $ US105756CC23: num [1:644] 98.9 98.9 98.9 98.9 98.9 ...
 $ USP3579ECH82: num [1:644] 99.8 99.8 99.8 99.8 99.8 ...
 $ USP3579ECJ49: num [1:644] 101 101 101 101 101 ...
 $ USP3699PGB78: num [1:644] 86.8 86.5 85.8 86 86 ...
 $ ICSUUSA     : num [1:644] 107 107 107 107 107 ...
 $ Brazil45    : num [1:644] 84.2 83.9 83.3 83.4 83.4 ...
 $ Brazil23    : num [1:644] 93.1 93.1 92.9 93 93 ...
 $ Brazil25    : num [1:644] 121 121 121 121 121 ...
 $ RepDom44    : num [1:644] 103 103 101 102 102 ...
 $ RepDom25    : num [1:644] 98.5 98.2 97.9 97.8 97.8 ...
 $ Colom33     : num [1:644] 148 148 147 146 146 ...
 $ Colom37     : num [1:644] 119 119 118 119 119 ...
 $ Colom41     : num [1:644] 107 106 106 106 106 ...
 $ XLV         : num [1:644] 92 90.9 90 89.5 89.5 ...
 $ XLK         : num [1:644] 68.2 65.6 64.2 64.7 64.7 ...
 $ QQQ         : num [1:644] 168 162 159 160 160 ...
 $ SPY         : num [1:644] 274 269 264 265 265 ...
 $ XLI         : num [1:644] 72 70.8 69.4 69.9 69.9 ...
 $ XLB         : num [1:644] 55.2 54.5 53.5 53.9 53.9 ...
 $ XLY         : num [1:644] 106 104 101 102 102 ...
 $ XLE         : num [1:644] 67.2 67.2 65 66 66 ...
 $ XD5D        : num [1:644] 39.3 39 38.4 38.9 38.5 ...
 $ JPMEIAC     : num [1:644] 139 139 136 138 140 ...
 $ IXN         : num [1:644] 26.4 25.4 24.8 25.1 25.1 ...
 $ IVV         : num [1:644] 276 271 266 267 267 ...
 $ EWJ         : num [1:644] 54.7 54.5 53.5 54.3 54.3 ...
 $ IJR         : num [1:644] 79.1 77.8 76.3 77.1 77.1 ...
 $ JPJEIAC     : num [1:644] 161 164 160 158 161 ...
 $ EFV         : num [1:644] 48.5 48.2 47.5 48.1 48.1 ...
 $ ENZL        : num [1:644] 48.1 47.1 46.1 46.9 46.9 ...
 $ IWM         : num [1:644] 152 149 146 148 148 ...
 $ XLF         : num [1:644] 26.8 26.8 26.2 26.2 26.2 ...
 $ Bitcoin     : num [1:644] 5452 4786 4338 4450 4428 ...
 $ Euro        : num [1:644] 1.14 1.15 1.14 1.14 1.14 1.13 1.13 1.13 1.14 1.14 ...
 $ Yen         : num [1:644] 113 113 113 113 113 ...
 $ Real        : num [1:644] 3.74 3.76 3.76 3.8 3.8 3.83 3.93 3.88 3.85 3.85 ...
 $ PesoMXN     : num [1:644] 20.2 20.4 20.4 20.2 20.3 ...
 $ Petroleo    : num [1:644] 56.5 56.8 53.4 54.6 54.6 ...
 $ Maiz        : num [1:644] 420 418 418 418 418 ...

Se convierten los datos a rendimientos y se vuelve a cargar la base de datos:

Al ser series de tiempo correspondientes a cotizaciones de diferentes opciones de inversión, es importante convertir los precios a rendimientos mediante ln(X/X t-1) esto para que las cotizaciones sean comparables:

datos <- read_excel("C:/Users/Brandon/Desktop/Proyecto de Graduacion Promidat/Datos_simulacion (1).xlsx", 
    sheet = "Datos_ln")
datos <- na.omit(datos)
datos$Dates<- as.Date(datos$Dates)
str(datos)
tibble [641 x 55] (S3: tbl_df/tbl/data.frame)
 $ Dates       : Date[1:641], format: "2018-11-19" "2018-11-20" ...
 $ G101121     : num [1:641] 0 -0.000438 -0.002959 0.001426 0.000219 ...
 $ G170822     : num [1:641] 0 -0.000446 -0.003575 0.001789 0.000223 ...
 $ G230823     : num [1:641] 0.000113 -0.000567 0.008577 0.000112 0.000112 ...
 $ G101221     : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ G260826     : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ G230222     : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ G210224     : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ G160725     : num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ G200524     : num [1:641] 0 -0.000557 -0.002902 0.001452 0.000112 ...
 $ G221130     : num [1:641] 0.000114 -0.000114 -0.002273 0 0 ...
 $ G261125     : num [1:641] 0 0 0.000119 -0.000119 0.000238 ...
 $ G250522     : num [1:641] 0.000111 -0.000555 -0.003334 0.001557 0.000222 ...
 $ G260527     : num [1:641] -0.000111 0 0 0 0 ...
 $ B1          : num [1:641] 0 -0.01044 0 -0.00263 -0.00253 ...
 $ SERIEB3     : num [1:641] 0 0 0.000104 0 0.000104 ...
 $ US105756CC23: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ USP3579ECH82: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ USP3579ECJ49: num [1:641] 0 0 0 0 0 0 0 0 0 0 ...
 $ USP3699PGB78: num [1:641] -0.00346 -0.008936 0.002678 0 -0.000116 ...
 $ ICSUUSA     : num [1:641] 1.88e-04 9.38e-05 0.00 0.00 2.81e-04 ...
 $ Brazil45    : num [1:641] -0.00369 -0.00682 0.00108 0 -0.00324 ...
 $ Brazil23    : num [1:641] -0.000537 -0.00172 0.001076 0 -0.001183 ...
 $ Brazil25    : num [1:641] -0.001321 0.000496 0.002474 0 -0.002227 ...
 $ RepDom44    : num [1:641] -0.005738 -0.010491 0.001674 0 -0.000787 ...
 $ RepDom25    : num [1:641] -0.003253 -0.002957 -0.000715 0 -0.000511 ...
 $ Colom33     : num [1:641] -0.00176 -0.00224 -0.00743 0 0 ...
 $ Colom37     : num [1:641] -0.00453 -0.00438 0.00194 0 -0.00059 ...
 $ Colom41     : num [1:641] -0.00452 -0.0051 0.00189 0 -0.00123 ...
 $ XLV         : num [1:641] -0.01279 -0.0094 -0.00568 0 0.00145 ...
 $ XLK         : num [1:641] -0.03886 -0.02172 0.00729 0 -0.00917 ...
 $ QQQ         : num [1:641] -0.03302 -0.01806 0.00757 0 -0.00726 ...
 $ SPY         : num [1:641] -0.0171 -0.0187 0.0034 0 -0.0067 ...
 $ XLI         : num [1:641] -0.01596 -0.02097 0.00704 0 -0.00201 ...
 $ XLB         : num [1:641] -0.0144 -0.01835 0.00801 0 -0.01082 ...
 $ XLY         : num [1:641] -0.0247 -0.0229 0.0104 0 -0.0045 ...
 $ XLE         : num [1:641] -0.000298 -0.033306 0.01558 0 -0.031876 ...
 $ XD5D        : num [1:641] -0.00868 -0.01524 0.01216 -0.00852 0.00363 ...
 $ JPMEIAC     : num [1:641] 0.00403 -0.02163 0.01486 0.01064 -0.01885 ...
 $ IXN         : num [1:641] -0.0367 -0.0223 0.0108 0 -0.0096 ...
 $ IVV         : num [1:641] -0.01686 -0.01873 0.00323 0 -0.0062 ...
 $ EWJ         : num [1:641] -0.0044 -0.01853 0.01522 0 -0.00369 ...
 $ IJR         : num [1:641] -0.0167 -0.01947 0.0103 0 -0.00013 ...
 $ JPJEIAC     : num [1:641] 0.01736 -0.02585 -0.00988 0.01874 0 ...
 $ EFV         : num [1:641] -0.00661 -0.01504 0.01338 0 -0.00981 ...
 $ ENZL        : num [1:641] -0.01954 -0.02122 0.01655 0 -0.00513 ...
 $ IWM         : num [1:641] -0.020479 -0.019468 0.013877 0 -0.000946 ...
 $ XLF         : num [1:641] -0.000373 -0.022278 0.000763 0 -0.008044 ...
 $ Bitcoin     : num [1:641] -0.13033 -0.09826 0.02566 -0.00509 -0.03851 ...
 $ Euro        : num [1:641] 0.00873 -0.00873 0 0 -0.00881 ...
 $ Yen         : num [1:641] -2.48e-03 1.95e-03 2.57e-03 -9.73e-04 8.85e-05 ...
 $ Real        : num [1:641] 0.00533 0 0.01058 0 0.00786 ...
 $ PesoMXN     : num [1:641] 0.00987 0 -0.00591 0.00296 0.00491 ...
 $ Petroleo    : num [1:641] 0.0053 -0.0605 0.0222 0 -0.0802 ...
 $ Maiz        : num [1:641] -0.00478 0 0 0 0 ...
 - attr(*, "na.action")= 'omit' Named int [1:3] 1 350 351
  ..- attr(*, "names")= chr [1:3] "1" "350" "351"

Analisis de Componentes Principales

A continuacion se realizara un Analisis en Componentes Principales (ACP) ya que le objetivo de este es construir un numero reducido de nuevas variables en las que se concentre la mayor cantidad posible de informacion de manera que en nuestro caso sera ver la agrupacion de las variables de la cartera de inversion.

datos1 <- datos %>% select(-Dates)
modelo <- PCA(datos1, scale.unit = TRUE, ncp =  4, graph = F)
fviz_pca_var(X = modelo,
col.var = "steelblue")

Es posible ver que las variables se podrian agrupar por cuadrantes en las cuales las del primer cuadrante estarian correlacionadas positivamente igual que las del 4to cuadrante y algunas de estas estarian correlacionadas negativamente con el Peso MXN el real y el yen que serian las variables mas alejadas.

fviz_pca_ind(X = modelo,
pointsize = 5,
pointshape = 21,
fill = "#E7B800")

Es posible observar que los puntos en este grafico se podrian dividir por cuadrante obteniendo 4 grandes cluster o podriamos dividirlo en 2 grandes clusters quedara mas claro mas adelante.

Eliminacion de individuo mal representados

Ahora se procede a eliminar los individuos mal representados con un (coseno cuadrado menor al 20%)

cos2.ind <- (modelo$ind$cos2[,1] + modelo$ind$cos2[,2])*100
cos2.var <- (modelo$var$cos2[,1] + modelo$var$cos2[,2])*100
round(cos2.var,2)
     G101121      G170822      G230823      G101221      G260826      G230222 
       19.77        21.97        14.00        14.33         5.71        21.35 
     G210224      G160725      G200524      G221130      G261125      G250522 
        0.14        10.02         9.96         0.74        13.68        24.97 
     G260527           B1      SERIEB3 US105756CC23 USP3579ECH82 USP3579ECJ49 
        5.32         3.39         1.54         6.62         0.29         2.06 
USP3699PGB78      ICSUUSA     Brazil45     Brazil23     Brazil25     RepDom44 
       34.60        11.57        72.40        63.46        52.54        42.41 
    RepDom25      Colom33      Colom37      Colom41          XLV          XLK 
       53.10        12.67        66.03        67.47        73.82        81.05 
         QQQ          SPY          XLI          XLB          XLY          XLE 
       77.58        95.57        85.78        83.41        86.48        63.42 
        XD5D      JPMEIAC          IXN          IVV          EWJ          IJR 
       59.17         1.10        82.82        95.63        73.36        82.62 
     JPJEIAC          EFV         ENZL          IWM          XLF      Bitcoin 
       12.41        85.87        63.91        86.45        82.40         5.97 
        Euro          Yen         Real      PesoMXN     Petroleo         Maiz 
        9.11        25.51        16.35        48.19         6.55         2.39 

Se observan cuales variables se encuentran bien representadas y cuales no tan bien.

fviz_pca_ind(modelo,
pointsize = 5,
pointshape = 21,
fill = "#E7B800",
select.ind = list(cos2 = 0.2)
)

En este grafico ya con la eliminacion de las variables mal representadas parece ser que las observaciones o puntos se dividen entre cuadrantes

fviz_pca_var(X = modelo,
col.var = "steelblue",
select.var = list(cos2 = 0.2))

fviz_pca_biplot(modelo,
col.var = "#2E9FDF",
col.ind = "#696969",
select.var = list(cos2 = 0.2))

Es posible ver las agrupaciones o cluster que se generarian por cuadrantes en el caso del segundo cuadrante las observaciones tendrian una correlacion negativa con las variables del cuarto cuadrante al igual que las del primer y tercer cuadrante.

Como parte del análisis, se calcula la matriz de correlaciones:

datos_cor<- select(datos,-Dates)
round(cor(datos_cor),2) 
             G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121         1.00    0.33    0.16    0.39    0.14    0.30    0.04    0.04
             G200524 G221130 G261125 G250522 G260527    B1 SERIEB3 US105756CC23
G101121         0.13    0.06    0.09    0.41    0.15  0.16    0.04         0.02
             USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA Brazil45 Brazil23
G101121              0.00         0.04         0.12    0.00     0.05     0.05
             Brazil25 RepDom44 RepDom25 Colom33 Colom37 Colom41   XLV   XLK
G101121          0.06     0.06     0.09   -0.01    0.05    0.05 -0.03 -0.04
               QQQ   SPY   XLI   XLB   XLY   XLE  XD5D JPMEIAC   IXN   IVV
G101121      -0.05 -0.04  0.00 -0.01 -0.04  0.03  0.02    0.03 -0.05 -0.04
               EWJ   IJR JPJEIAC   EFV  ENZL   IWM   XLF Bitcoin  Euro   Yen
G101121      -0.02 -0.01   -0.01  0.00  0.02 -0.01  0.00    0.05  0.02 -0.06
              Real PesoMXN Petroleo  Maiz
G101121      -0.05   -0.05     0.05  0.06
 [ reached getOption("max.print") -- omitted 53 rows ]

Calcular la matriz, con el p-value

Una vez que calculamos el coeficiente de correlación, es necesario identificar si es estadísticamente significativo, por lo que calculamos el p-value.

Si el p-value es menor al nivel de significancia que nosotros escogemos, por ejemplo 5%, entonces el coeficiente es estadísticamente significativo.

rcorr(as.matrix(datos_cor))
             G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121         1.00    0.33    0.16    0.39    0.14    0.30    0.04    0.04
             G200524 G221130 G261125 G250522 G260527    B1 SERIEB3 US105756CC23
G101121         0.13    0.06    0.09    0.41    0.15  0.16    0.04         0.02
             USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA Brazil45 Brazil23
G101121              0.00         0.04         0.12    0.00     0.05     0.05
             Brazil25 RepDom44 RepDom25 Colom33 Colom37 Colom41   XLV   XLK
G101121          0.06     0.06     0.09   -0.01    0.05    0.05 -0.03 -0.04
               QQQ   SPY   XLI   XLB   XLY   XLE  XD5D JPMEIAC   IXN   IVV
G101121      -0.05 -0.04  0.00 -0.01 -0.04  0.03  0.02    0.03 -0.05 -0.04
               EWJ   IJR JPJEIAC   EFV  ENZL   IWM   XLF Bitcoin  Euro   Yen
G101121      -0.02 -0.01   -0.01  0.00  0.02 -0.01  0.00    0.05  0.02 -0.06
              Real PesoMXN Petroleo  Maiz
G101121      -0.05   -0.05     0.05  0.06
 [ reached getOption("max.print") -- omitted 53 rows ]

n= 641 


P
             G101121 G170822 G230823 G101221 G260826 G230222 G210224 G160725
G101121              0.0000  0.0000  0.0000  0.0002  0.0000  0.3269  0.2623 
             G200524 G221130 G261125 G250522 G260527 B1     SERIEB3
G101121      0.0008  0.1525  0.0209  0.0000  0.0000  0.0000 0.2795 
             US105756CC23 USP3579ECH82 USP3579ECJ49 USP3699PGB78 ICSUUSA
G101121      0.5661       0.9661       0.3121       0.0033       0.9759 
             Brazil45 Brazil23 Brazil25 RepDom44 RepDom25 Colom33 Colom37
G101121      0.2477   0.2174   0.1407   0.1359   0.0185   0.7833  0.1721 
             Colom41 XLV    XLK    QQQ    SPY    XLI    XLB    XLY    XLE   
G101121      0.1681  0.4805 0.2564 0.2180 0.3762 0.9157 0.7106 0.2782 0.4738
             XD5D   JPMEIAC IXN    IVV    EWJ    IJR    JPJEIAC EFV    ENZL  
G101121      0.5580 0.4283  0.2399 0.3362 0.5306 0.7853 0.7583  0.9433 0.5875
             IWM    XLF    Bitcoin Euro   Yen    Real   PesoMXN Petroleo Maiz  
G101121      0.8717 0.9847 0.2205  0.6391 0.1547 0.2165 0.2434  0.1869   0.1321
 [ reached getOption("max.print") -- omitted 53 rows ]

Se procede a graficar la matriz de correlaciones:

correlacion<-round(cor(datos_cor), 1)
corrplot(correlacion, method="number", type="upper")

En la grafica de correlaciones se identifica mediante color azul, la correlacion positiva entre variables, a mayor intensidad del color mayor es la correlación positiva entre ellas. Por otra parte, la correlacion negativa, es decir, si el rendimiento de una aumenta, el rendimientos de la otra disminuye, se identifica mediante el color rojo, y su intensidad indica mayor correlacion negativa.

Clustering jerárquico:

Clustering jerárquico:

Para proceder con nuestro análisis, dado que datos_cor es una base de datos de serie de tiempo, tenemos que utilizar la traspuesta de la base de datos:

datos_T <- t(datos_cor)

Una vez definida la base de datos, se procede a realizar el análisis de Clustering Jerárquico o Agrupación.

clustering jerárquico es una técnica para agrupar puntos de datos similares en un grupo y separar las diferentes observaciones en diferentes grupos. Los clusters se crean de manera que tengan un orden predeterminado, es decir, una jerarquía.

Para determinar, la cantidad de clusters con la cuál se estabiliza el modelo, se utiliza la técnica del codo de Jambu:

Codo de Jambu para definir número de clusters:

InerciaIC<-rep(0,9)
for(k in 1:9) {
grupos<-kmeans(datos_T, centers=k, nstart=5,iter.max = 100)
InerciaIC[k]<-grupos$tot.withinss
}
plot(InerciaIC,col="blue",type="b")

El codo de Janbu indica que lo ideal es definir 4 clusters para el modelo.

Una vez que tenemos el número de clusteres, se procede a realizar el dendograma:

Cluster Jerárquico, dendogramas según metodo:

Salto máximo: Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. La mayor de todas ellas se selecciona como la distancia entre los dos clusters. Se trata de la medida más conservadora (maximal intercluster dissimilarity).

distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "complete")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")

Salto mínimo:Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. La menor de todas ellas se selecciona como la distancia entre los dos clusters. Se trata de la medida menos conservadora (minimal intercluster dissimilarity).

distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "single")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")

Salto promedio: Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. El valor promedio de todas ellas se selecciona como la distancia entre los dos clusters (mean intercluster dissimilarity).

distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "average")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")

Salto Centroide: Se calcula el centroide de cada uno de los clusters y se selecciona la distancia entre ellos como la distancia entre los dos clusters.

distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "centroid")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")

Salto Ward: Hacer variar lo menos posible la inercia intra-clases en cada etapa de agregación es buscar el mínimo de pérdida de inercia inter-clases resultante de la agregación de dos elementos. Así en cada etapa la inercia intra-clases aumenta en la cantidad Δ (y la inercia inter-clases disminuye en esta misma cantidad).

distancias <- dist(datos_T)
modelo <- hclust(distancias, method = "ward.D")
plot(modelo)
rect.hclust(modelo, k = 4, border = "red")

Comparación de métodos:

library(purrr)
# Vector comparativo de métodos:
metodos <- c( "average", "single", "complete", "ward")
names(metodos) <- c( "average", "single", "complete", "ward")
 
# Funcion para comparar métodos:
ac <- function(x) {
  agnes(datos_T, method = x)$ac
}
map_dbl(metodos, ac)      
  average    single  complete      ward 
0.8496885 0.8614611 0.8655797 0.8853590 

Conclusiones

Al utilizar la funcion agnes, obtenemos el coeficiente de aglomeración, que mide la cantidad de estructura de agrupamiento encontrada (los valores más cercanos a 1 sugieren una estructura de agrupación fuerte). En este caso, el mejor método es el método ward.

De acuerdo con los resultados utilizando el método Ward.D, el cluster 1 agrupa las opciones de inversión que corresponden a bonos de deuda de países como Costa Rica, Brasil, República Dominicana, Colombia, y monedas como el Euro, el Yen y el Real. Además, incluye 1 materia prima: Maiz

El cluster 2, incluye los indices accionarios y los cluster 3 y 4, el bitcoin y el petroleo, respectivamente.

El modelo cumple con nuestras expectativas respecto a identificar de una manera más eficiente los instrumentos que tienen un comportamiento similar entre sí, de esta forma es más sencillo seleccionar los instrumentos que permitan diversificar los portafolios en pro de obtener una mayor rentabilidad de las inversiones.